class LiczbaException extends Exception
{
	LiczbaException(String x)
	{
		super(x);
	}
}
public class Liczba
{
	private int n;
	Liczba()
	{
		n=0;
	}
	Liczba(int n)
	{
		this.n = n;
	}
	
	private int[] konwerter(String x) throws LiczbaException
	{
		try
		{
			int dlugosc=x.length();
			int liczby[]= new int[dlugosc];
			String tempchar;
			for(int i=0; i < dlugosc ; i++)
			{
				tempchar= ""+ x.charAt(i);
				try
				{
					liczby[i]=Integer.parseInt(tempchar);
				}
				catch(NumberFormatException w)
				{
					switch( tempchar )
					{
						case "a": liczby[i] = 10; break;
						case "b": liczby[i] = 11; break;
						case "c": liczby[i] = 12; break;
						case "d": liczby[i] = 13; break;
						case "e": liczby[i] = 14; break;
						case "f": liczby[i] = 15; break;
						case "g": liczby[i] = 16; break;
						default: throw new LiczbaException("W \"liczbie\" wystapil niedozwolony znak");
					}
				}
			}
			return liczby;
		}
		catch( OutOfMemoryError ex)
		{
			throw new LiczbaException("Blad Pamieci");
		}
		catch( LiczbaException ex2)
		{
			throw ex2;
		}
	}
	
	Liczba( String n, int podstawa ) throws LiczbaException
	{
		try
		{
			int liczby[] = konwerter(n);
			int temp = 0;
			int dlugosc = liczby.length;
			int wykladnik = dlugosc - 1 ;
			if( podstawa < 1 || podstawa > 17) throw new LiczbaException("Nie wlasciwa podstawa, obslugiwany zakres to: 1-17");
			if( podstawa == 1)
			{
				for(int i=0; i < dlugosc; i++)
				{
					if(liczby[i] != 1) throw new LiczbaException("Nie wlasciwa liczba wzgledem podstawy");
					temp++;
				}
				this.n=temp;
			}
			else
			{
				for(int i=0; i < dlugosc; i++)
				{
					if(liczby[i] >= podstawa)
					{
						this.n=0;
						throw new LiczbaException("Nie wlasciwa liczba wzgledem podstawy");
					}
					temp = liczby[i];
					for( int j=0; j < wykladnik; j++)
					{
						temp *= podstawa;
					}
					wykladnik--;
					this.n += temp;
				}
			}
		}
		catch( OutOfMemoryError ex )
		{
			throw new LiczbaException("Blad Pamieci");
		}
		catch( LiczbaException ex2)
		{
			throw ex2;
		}
	}
	
	public String zapis(int podstawa) throws LiczbaException
	{
		if(podstawa < 1 || podstawa > 17) throw new LiczbaException("Nie wlasciwa podstawa, obslugiwany zakres to: 1-17");
		String wynik="";
		if(podstawa == 1)
		{
			for(int i = 0; i < this.n; i++)
			{
				wynik += "1";
			}
		}
		else
		{
			int temp=this.n ;
			do
			{
				switch( temp % podstawa )
				{
					case 10: wynik = "a" + wynik; break;
					case 11: wynik = "b" + wynik; break;
					case 12: wynik = "c" + wynik; break;
					case 13: wynik = "d" + wynik; break;
					case 14: wynik = "e" + wynik; break;
					case 15: wynik = "f" + wynik; break;
					case 16: wynik = "g" + wynik; break;
					default: wynik = Integer.toString( temp % podstawa ) +wynik;
				}
				temp = (int)(temp/podstawa);
			}while( temp!=0 );			
		}
		return wynik;
	}
}	

